package service

import (
	"fmt"

	"mutu/misc/log"
	"mutu/models"
)

type TagManager struct {
}

var (
	TagService = TagManager{}
)

func (p TagManager) GetAllClasses() ([]*models.Class, error) {
	var arr []*models.Class
	_, err := models.Orm.QueryTable("Class").All(&arr)
	if err != nil {
		log.Log.Error("读取所有标签类型出错，%s", err)
		return nil, err
	}
	return arr, nil
}

func (p TagManager) GetClassByName(name string) (*models.Class, error) {
	item := &models.Class{
		Name: name,
	}
	err := models.Orm.Read(item, "Name")
	if err != nil {
		log.Log.Error("读取<%s>标签类型出错，%s", name, err)
		return nil, err
	}

	return item, nil
}

func (p TagManager) GetTagsByClass(classid int) ([]*models.Tag, error) {
	var arr []*models.Tag
	_, err := models.Orm.QueryTable("Tag").Filter("ClassId", classid).All(&arr)
	if err != nil {
		log.Log.Error("读取所有标签出错，%s", err)
		return nil, err
	}
	return arr, nil
}

func (p TagManager) GetTagsByClassName(name string) ([]*models.Tag, error) {
	class, err := p.GetClassByName(name)
	if err != nil {
		return nil, err
	}
	return p.GetTagsByClass(class.Id)

}

func (p TagManager) GetAllTags() ([]*models.Tag, error) {
	var arr []*models.Tag
	_, err := models.Orm.QueryTable("Tag").All(&arr)
	if err != nil {
		log.Log.Error("读取所有标签出错，%s", err)
		return nil, err
	}
	return arr, nil

}

func (p TagManager) CreateRelTags(tagids []int, flag int, relid string) error {
	if len(tagids) == 0 {
		return nil
	}

	for _, tagid := range tagids {
		tagm := &models.TagsMap{
			TagId: tagid,
			Flag:  flag,
			RelId: relid,
		}
		_, err := models.Orm.Insert(tagm)
		if err != nil {
			log.Log.Error("保存标签<%d:%d:%s>出错，%s", err)
			return err
		}
	}
	return nil

}

func (p TagManager) ReleaseRelTags(flag int, relid string) error {
	if flag <= 0 || len(relid) == 0 {
		return nil
	}

	_, err := models.Orm.QueryTable("TagsMap").Filter("Flag", flag).Filter("RelId", relid).Delete()
	return err
}

func (p TagManager) GetRelTags(flag int, relid string) ([]*models.Tag, error) {
	var arr []*models.TagsMap
	count, err := models.Orm.QueryTable("TagsMap").Filter("Flag", flag).Filter("RelId", relid).All(&arr)
	if err != nil {
		log.Log.Error("读取Flag<%d:%s>所有关联标签出错，%s", flag, relid, err)
		return nil, nil
	}

	arr2 := make([]*models.Tag, count)
	for i, item := range arr {
		t := &models.Tag{
			Id: item.TagId,
		}
		if err = models.Orm.Read(t); err != nil {
			log.Log.Error("读取标签<%d>出错，%s", item.TagId, err)
			return nil, nil
		}
		arr2[i] = t

	}

	return arr2, nil

}

func (p TagManager) GetAllTagsWithRelCount(flag int) ([]*models.Tag, error) {
	var arr []*models.Tag
	var sql string
	if flag <= 0 {
		sql = `SELECT a.tag_id, b.name, b.class_id, count(*) as count FROM mutu.tags_map a left join mutu.tag b on a.tag_id=b.id group by a.tag_id;`
	} else {
		sql = fmt.Sprintf(`SELECT a.tag_id, b.name, b.class_id, count(*) as count FROM mutu.tags_map a left join mutu.tag b on a.tag_id=b.id where a.flag='%d' group by a.tag_id;`,
			flag)
	}
	// r, err := models.Orm.Raw(sql).Exec()
	// fmt.Printf("resut:", ...)
	if _, err := models.Orm.Raw(sql).QueryRows(&arr); err != nil {
		log.Log.Error("读取分类信息及关联素材个数，读取失败，%s", err)
		return nil, err
	}
	fmt.Printf("resut: %+v", arr)
	return arr, nil

}
